<?php

namespace App\Remote\Mybank;

use App\Kuafu\Mybank\Enum\MybankFunctionEnum;
use Illuminate\Http\Request;

class MybankCashierRemote extends Remote
{


    /**
     * 统一支付创单接口
     * @param string $kfOrderId
     * @param int $totalAmount
     * @param string $orderType
     * @param array $payeeInfo
     * @param array $payerInfo
     * @param string $body
     * @param string $memo
     * @param string $goodsTag
     * @param string $goodsDetail
     * @param string $subOrderList
     * @param string $extInfo
     * @return mixed
     */
    public static function createOrder(
        string $kfOrderId,
        int $totalAmount,
        string $orderType,
        array $payeeInfo,
        array $payerInfo,
        string $body,
        string $memo = '',
        string $goodsTag = '',
        string $goodsDetail = '',
        string $subOrderList = '',
        string $extInfo = ''
    ) {
        $params               = [
            'IsvOrgId'             => Remote::getIsvOrgId(),
            'OrderType'            => $orderType,// 订单类型编号
            'OutTradeNo'           => $kfOrderId,// 外部订单请求流水号
            'TotalAmount'          => $totalAmount,// 订单总金额
            'Currency'             => 'CNY',// 币种
            'PayeeId'              => $payeeInfo['payeeId'],// 收方ID 若Type为 MERCHANT，ID为商户号
            'PayeeType'            => $payeeInfo['payeeType'],// 收方类型  MERCHANT
            'PayerId'              => $payerInfo['payerId'],// 付方ID  若Type为 MERCHANT，ID为商户号
            'PayerType'            => $payerInfo['payerType'],// 付方类型  MERCHANT 传参区别 PayerType 传入 MEMBER，PayerId 为空，拿到创单接口orderNo
            'Body'                 => $body,// 商品描述。该信息在客户端明细中展示。
            'GoodsTag'             => $goodsTag,// 商品标记。
            'GoodsDetail'          => $goodsDetail,// 商品详情列表
            'SubOrderList'         => $subOrderList,// 合并支付时，明细单列表
            'ExtInfo'              => $extInfo,// 扩展信息 商品信息 单件 数量
            'Memo'                 => $memo,// 备注（可填写订单描述信息）
            'IsPayToBalanceFreeze' => 'N',// 是否入账到可用子户冻结成分 Y：入金到收方可用冻结 N（或其他非Y值）：入金到收方可用解冻 不传默认N的逻辑
        ];
        return self::returnBodyData(self::customRequestV2(
            config('pay.mybank.sbServerUrl'),
            Request::METHOD_POST,
            self::buildXmlRequestData($params, MybankFunctionEnum::BKCLOUDFUNDS_UNIFIED_ORDER_CREATE)
        ));
    }


    /**
     * 统一支付订单查询接口
     * @param string $orderNo
     * @param string $outTradeNo
     * @return mixed
     */
    public static function queryOrder(string $orderNo, string $outTradeNo)
    {
        $params = [
            'IsvOrgId'   => Remote::getIsvOrgId(),
            'OrderNo'    => $orderNo,// 网商订单号
            'OutTradeNo' => $outTradeNo,// 外部订单请求流水号
        ];
        return self::returnBodyData(self::customRequestV2(
            config('pay.mybank.sbServerUrl'),
            Request::METHOD_POST,
            self::buildXmlRequestData($params, MybankFunctionEnum::BKCLOUDFUNDS_UNIFIED_ORDER_QUERY)
        ));
    }


    /**
     * 支付退回申请接口
     * @param string $outTradeNo
     * @param string $orderNo
     * @param int $refundAmount
     * @param array $payeeInfo
     * @param string $refundReason
     * @param string $extInfo
     * @param string $memo
     * @return mixed
     */
    public static function refundApplyOrder(
        string $outTradeNo,
        string $orderNo,
        int $refundAmount,
        array $payeeInfo,
        string $refundReason,
        string $extInfo,
        string $memo
    ) {
        $params = [
            'IsvOrgId'        => Remote::getIsvOrgId(),
            'ParticipantType' => $payeeInfo['payeeType'],// 退款付方类型，即原支付单收方  商户(MERCHANT)、 平台(PLATFORM)
            'ParticipantId'   => $payeeInfo['payeeId'],// 退款付方id，即原支付单收方 如果是商户，则填入merchantId, 如果是平台，则填入isvOrgId
            'RelateOrderNo'   => $orderNo,// 关联网商订单号
            'RelateTransNo'   => '',// 关联网商支付流水号 支付流水号  1）如果大额来账创建订单类型为单次订单，可不填 2）如果大额来账创建订单类型为订单累计，则必填
            'OutRefundNo'     => $outTradeNo,// 退款外部交易号。由合作方生成，同笔退款交易，交易状态未明需要重试时，使用同一个交易号。
            'RefundAmount'    => $refundAmount,// 订单退款金额。向渠道退款金额。
            'Currency'        => 'CNY',// 币种
            'RefundReason'    => $refundReason,// 退款原因
            'ExtInfo'         => $extInfo,// 扩展信息,Map的json序列化后Base64
            'Memo'            => $memo,// 备注
        ];
        return self::returnBodyData(self::customRequestV2(
            config('pay.mybank.sbServerUrl'),
            Request::METHOD_POST,
            self::buildXmlRequestData($params, MybankFunctionEnum::BKCLOUDFUNDS_REFUND_APPLY)
        ));
    }


    /**
     * 支付退回查询接口
     * @param string $orderNo
     * @param string $outTradeNo
     * @param string $refundOrderNo
     * @param array $payeeInfo
     * @return mixed
     */
    public static function refundQueryOrder(
        string $orderNo,
        string $outTradeNo,
        string $refundOrderNo,
        array $payeeInfo
    ) {
        $params               = [
            'IsvOrgId'        => Remote::getIsvOrgId(),
            'RelateOrderNo'   => $orderNo, // 关联网商订单号
            'ParticipantType' => $payeeInfo['payeeType'], // 退款参与方类型 商户(MERCHANT)、 平台(PLATFORM)、子户汇入（SUBACCOUNT）
            'ParticipantId'   => $payeeInfo['payeeId'], // 退款参与方id 如果是商户，则填入merchantId, 如果是平台，则填入isvOrgId 如果是子户汇入，则填入汇入子户外标
            'OutRefundNo'     => $outTradeNo, // 退款外部交易号
            'RefundOrderNo'   => $refundOrderNo, // 网商退款订单号
        ];
        return self::returnBodyData(self::customRequestV2(
            config('pay.mybank.sbServerUrl'),
            Request::METHOD_POST,
            self::buildXmlRequestData($params, MybankFunctionEnum::BKCLOUDFUNDS_REFUND_QUERY)
        ));
    }

    /**
     * 订单关闭接口
     * @param string $orderNo
     * @param string $outTradeNo
     * @param array $payeeInfo
     * @return mixed
     */
    public static function closeOrder(
        string $orderNo,
        string $outTradeNo,
        array $payeeInfo
    ) {
        $params = [
            'IsvOrgId'   => Remote::getIsvOrgId(),
            'PayeeId'    => $payeeInfo['payeeId'],// 作为收款方账号。 1. 如果收款方是平台，那么这个字段的值和 IsvOrgId 相同2. 如果收款方是商户，那么这个字段是商户号（merchantId）
            'OutTradeNo' => $outTradeNo,// 原外部订单请求流水号
            'OrderNo'    => $orderNo,// 原网商订单号
            'PayeeType'  => $payeeInfo['payeeType'],// 参与方类型 商户(MERCHANT)、平台(PLATFORM)
        ];
        return self::returnBodyData(self::customRequestV2(
            config('pay.mybank.sbServerUrl'),
            Request::METHOD_POST,
            self::buildXmlRequestData($params, MybankFunctionEnum::BKCLOUDFUNDS_VOSTRO_CLOSE_ORDER)
        ));
    }
}
